"""
提示词管理模块
负责生成和管理各种AI提示词
"""

import logging
from typing import Dict, Any
from app.models.schemas import TestCaseRequest

logger = logging.getLogger(__name__)


class PromptManager:
    """提示词管理器"""

    def __init__(self):
        self.system_prompt = """你是专业的测试工程师，专门负责根据需求生成测试用例。

【核心任务】：生成测试用例，不是需求分析，不是功能分析，就是测试用例！

【输出要求】：
1. 必须返回包含test_cases字段的JSON格式
2. 不要返回modules、test_points、analysis等分析相关字段
3. 只返回JSON，不要任何解释说明
4. 确保生成足够数量的测试用例

【JSON格式】：
{
  "test_cases": [
    {
      "id": "TC001",
      "title": "功能点-测试场景",
      "preconditions": "前置条件",
      "steps": [
        {"step_number": 1, "description": "操作步骤",
            "expected_result": "预期结果", "test_data": {}}
      ],
      "priority": "P1",
      "category": "功能测试",
      "test_type": "functional",
      "test_executor": "qa",
      "test_design_method": "use_case",
      "test_data": {},
      "notes": ""
    }
  ]
}

记住：只生成测试用例，不要分析需求！"""

    def create_prompt(self, request: TestCaseRequest, provider: str = "", model: str = "") -> str:
        """创建智能化的测试用例生成提示词"""
        requirement = request.requirement or "功能测试需求"

        # 导入智能提示词生成器
        try:
            from smart_prompts import get_smart_prompt_and_config, optimize_prompt_for_model

            # 获取智能提示词和配置，传递模型信息用于推理模型检测
            system_prompt, user_prompt, config = get_smart_prompt_and_config(
                requirement,
                speed_priority=True,  # 优先考虑速度
                model=model  # 传递模型名称用于推理模型检测
            )

            # 组合完整提示词
            base_prompt = f"{system_prompt}\n\n{user_prompt}"

            # 为特定模型优化提示词
            if provider and model:
                optimized_prompt = optimize_prompt_for_model(
                    base_prompt, provider, model)
                logger.info(f"为 {provider}/{model} 优化提示词")
            else:
                optimized_prompt = base_prompt

            # 记录提示词优化信息
            logger.info(
                f"使用智能提示词系统，提示词长度: {len(optimized_prompt)} 字符（优化前约4400字符）")
            logger.info(f"预期max_tokens: {config.get('max_tokens', 2000)}")

            # 将配置存储到请求对象中，供后续使用
            if hasattr(request, '__dict__'):
                request.__dict__['smart_config'] = config

            return optimized_prompt

        except ImportError:
            logger.warning("智能提示词系统不可用，使用传统提示词")
            # 回退到简化版传统提示词
            return self._create_fallback_prompt(request, provider, model)

    def get_smart_config(self, request: TestCaseRequest) -> Dict[str, Any]:
        """获取智能提示词配置"""
        return getattr(request, 'smart_config', {})

    def _create_fallback_prompt(self, request: TestCaseRequest, provider: str = "", model: str = "") -> str:
        """创建回退提示词"""
        requirement = request.requirement or "功能测试需求"

        # 基础提示词
        prompt_parts = [
            "请根据以下需求生成测试用例：",
            f"需求描述：{requirement}",
            "",
            "请生成详细的测试用例，包括：",
            "1. 测试用例标题",
            "2. 前置条件",
            "3. 测试步骤",
            "4. 预期结果",
            "5. 优先级",
            "",
            "请确保：",
            "- 覆盖正常流程和异常流程",
            "- 包含边界值测试",
            "- 测试步骤详细具体",
            "- 预期结果明确",
            "",
            "请以JSON格式返回，格式如下：",
            """{
  "test_cases": [
    {
      "id": "TC001",
      "title": "测试用例标题",
      "preconditions": "前置条件",
      "steps": [
        {
          "step_number": 1,
          "description": "操作步骤",
          "expected_result": "预期结果",
          "test_data": {}
        }
      ],
      "priority": "P1",
      "category": "功能测试",
      "test_type": "functional",
      "test_executor": "qa",
      "test_design_method": "use_case",
      "test_data": {},
      "notes": ""
    }
  ]
}"""
        ]

        base_prompt = "\n".join(prompt_parts)

        # 为特定模型优化回退提示词
        if provider and model:
            try:
                from smart_prompts import optimize_prompt_for_model
                return optimize_prompt_for_model(base_prompt, provider, model)
            except ImportError:
                pass

        return base_prompt

    def create_analysis_prompt(self, requirement: str) -> str:
        """创建需求分析提示词"""
        return f"""请分析以下需求，提取功能模块和测试点：

需求内容：
{requirement}

请以JSON格式返回分析结果：
{{
  "modules": [
    {{
      "name": "模块名称",
      "description": "模块描述",
      "priority": "P1",
      "test_points": ["测试点1", "测试点2"]
    }}
  ],
  "test_points": [
    {{
      "point": "测试点描述",
      "scenarios": ["场景1", "场景2"]
    }}
  ],
  "business_rules": ["业务规则1", "业务规则2"],
  "constraints": ["约束条件1", "约束条件2"]
}}"""

    def create_module_prompt(self, module: Dict[str, Any], original_requirement: str) -> str:
        """为单个模块创建提示词"""
        module_name = module.get('name', '功能模块')
        module_desc = module.get('description', '')
        test_points = module.get('test_points', [])

        prompt_parts = [
            f"请为以下功能模块生成测试用例：",
            f"模块名称：{module_name}",
            f"模块描述：{module_desc}",
        ]

        if test_points:
            prompt_parts.append("测试要点：")
            for point in test_points:
                prompt_parts.append(f"- {point}")

        # 添加原始需求的相关部分
        if original_requirement:
            prompt_parts.append(f"\n原始需求参考：\n{original_requirement[:500]}...")

        prompt_parts.extend([
            "",
            "请生成详细的测试用例，确保覆盖所有测试要点。",
            "请以JSON格式返回测试用例。"
        ])

        return "\n".join(prompt_parts)

    def get_system_messages(self) -> list:
        """获取系统消息"""
        return [{"role": "system", "content": self.system_prompt}]
